################################################################################
# Procedure d'envoi effectif de message
################################################################################
proc procEnvoi { param_message } {
	puts stdout  $param_message

	#procEcrireFichier "out" $param_message
}


################################################################################
# Procedure appelee a l'appui sur le bouton envoi
################################################################################
proc procEnvoiMessage { } {
	# Recupere le message ecrit dans la zone de saisie via sa variable globale
	global var_messageEnvoye
	
	# Recupere le salon ou la personne parle
	global var_salonCourantId
	
	# Recupere son id
	global var_noeudId
	
	# Si on n'est connect�a aucun salon : erreur
	if { [info exists var_salonCourantId] == 0 } {
		return
	}

	procEnvoi  [proc_construireMessage $var_noeudId $var_salonCourantId $var_messageEnvoye]
	
	# Ecrit le message dans la zone de reception de l'emetteur (peut etre pas necessaire si il recoit son propre message)
	# Ajoute ce message a la liste
	proc_ajouterMessageListe [proc_getMessageContent [proc_construireMessage $var_noeudId $var_salonCourantId $var_messageEnvoye]]
	
	# rafraichi l'affichage si necessaire
	proc_afficheMessages
}

################################################################################
# Procedure appelee en cas de reception sur l'entree standard
################################################################################
proc proc_receptionMessage { } {
	# lecture de l'entree standard
	
	set var_messageRecu [read stdin]
	
	#procEcrireFichier "in" $var_messageRecu
	
	set var_listeMessages [split $var_messageRecu "\n"]
	
	foreach var_messageCourant $var_listeMessages {
	
		if { [string length $var_messageCourant] > 0 } {
			#procEcrireFichier "in" "-$var_messageCourant-"
			

			# Determine le type de message et reagit en consequence
			set var_messageType [proc_getMessageType $var_messageCourant]
			
			# Depaquetage de l'entete contenant le type de message
			set var_messageContent [proc_getMessageContent $var_messageCourant]

			# Message de type "message"
			if { $var_messageType < 10 } {
				proc_traiterMessageTypeMessage $var_messageType $var_messageContent
			# Message de type "ping"
			} 
			
			if { $var_messageType >= 20 } {
				proc_traiterMessageTypePing $var_messageType $var_messageContent
			} 
			# Message de type "salon"
			if { $var_messageType >= 10 && $var_messageType < 20 } {
			
				proc_traiterMessageTypeSalons $var_messageType $var_messageContent
			}
			
		}
	
	
	}
	
	#procEcrireFichier "in" "\n----------------------\n"
	
	
}




## TYPE "MESSAGE" ##############################################################

################################################################################
# Procedure generale de traitement des messages de type "message"
################################################################################
proc proc_traiterMessageTypeMessage { param_type param_message } {
	# Test si on est connecte au salon auquel est destine le message
	# Si oui on stocke le message

	if {[proc_connecteAuSalonMessage $param_message] == 1} {
		
		# Ajoute ce message a la liste
		proc_ajouterMessageListe $param_message
		
		# Recupere (si necessaire) les informations du noeud : pseudo,...
		proc_getNoeudInfosFromMessage $param_message
		
		# rafraichi l'affichage si necessaire
		proc_afficheMessages 
		
	# Sinon ...
	} else {
	
	}
}

################################################################################
# Procedure recuperant les information sur l'emetteur du message
################################################################################
proc proc_getNoeudInfosFromMessage { param_message } {
	global var_listeNoeuds
	
	array set var_messageArray  [proc_buildArrayFromMessage $param_message]
			
	proc_ajouterNoeudPseudo $var_messageArray(noeudId) "inconnu"
	
	proc_ajouterNoeudListeConnectesSalon $var_messageArray(noeudId) $var_messageArray(salonId)
}


################################################################################
# Procedure ajoutant le message recu a la liste des messages
################################################################################
proc proc_ajouterMessageListe { param_message } {
	# Recupere la liste des messages
	global var_listeMessages
	
	lappend var_listeMessages([proc_getSalonIdFromMessage $param_message])  [proc_buildArrayFromMessage $param_message]
}



## TYPE "PING" ##############################################################

################################################################################
# Procedure generale de traitement des messages de type "ping"
################################################################################
proc proc_traiterMessageTypePing { param_type param_message } {
	global var_noeudId

	switch $param_type {
		"20" {
			array set var_ping [proc_parsePing $param_message]
			# pause pour les tests
			# after [expr int(10*rand())]
			procEnvoi [proc_construireReponsePing $var_noeudId $var_ping(emmeteurId) $var_ping(dateEnvoi)]
		}
		"21" {
			
			
			proc_voisinsTraiterReponsePing [proc_parseReponsePing $param_message]
			
			
		}
	}
	
}

################################################################################
# Procedure generale de traitement des messages de type "salons"
################################################################################
proc proc_traiterMessageTypeSalons { param_type param_message } {
	
	
	switch $param_type {
		"10" {
			proc_voisinsTraiterSalonsPing [proc_parseSalonsPing $param_message]
			 
		}
	}
	
}


